gusucode.com > LTE基带收发仿真系统matlab源码程序 > LTE baseband simulation/demo_DSH_process.m

    % function demo_DSH_process
% 请从LTE_main_gui_final.m文件开始运行
% 下行共享信道数据生成
% 基站的基带处理函数,该函数仅用户数据信道,PDSCH处理流程为:
% 产生信息-->CRC校验-->码块分割-->turbo编码-->速率匹配
% -->加扰-->层映射-->预编码-->子载波映射-->OFDM调制-->天线映射
%
%  Author:		程式小组(徐萌 张妙 张晓庆)
%  Date:		2010-07-11
%  ==========================================================

global LTE_par

bar = WaitBar(0,'仿真开始>>>',gcf,550,320);


% 时间模拟标记 在19.8s处理完成,将数据保存待发送,否则丢弃
LTE_par.genFlag = 1;

fprintf('仿真起始帧号为 %d 子帧号为 %d \n',LTE_par.iFrame,LTE_par.iSubFrame);

LTE_schedule_subband % 此处只对用户分配到固定的子带上

for iSimu = 1:LTE_par.nTime
    
    str = sprintf('当前进行第 %d 次仿真>>>',iSimu);
    WaitBar(iSimu/LTE_par.nTime,bar,str);
    
    nUE = LTE_par.nUE;                      % 用户总数
    CP = LTE_par.CP;                        % 循环前缀长度
    nTx = LTE_par.BS_par.nAnt;              % 基站端天线数
    RNTI = LTE_par.UE_par.RNTI;             % 无线网络临时指示
    cellID = LTE_par.BS_par.cellID;         % 小区ID号
    iSubFrame = LTE_par.iSubFrame;          % 当前子帧号 取值为0~9
    FFT_SIZE = LTE_par.FFT_SIZE;            % FFT变换点数
    transMod = LTE_par.UE_par.transMod;     % 传输模式 1~7
    preProcess = LTE_par.UE_par.preProcess; % 预处理模式  1:singleAnt,2:tranmitDiversity 3:spatialMultiplexing
    
    % 基带处理起始时间
    t0 = clock;
    % 打印输出当前用户参数配置
    show_par();
    
    if LTE_par.errFlag == false
        % ===================PRBS 数据产生器 ===============================
        % PRBS起始时间
        t0 = clock;
        saveSendInfo = cell(nUE,1);
        for iUE = 1:nUE
            sizeTB = LTE_par.UE_par.sizeTB(:,iUE);  % iUE的传输块大小
            % 信息生成
            sendInfoBit = info_gen(sizeTB);
            saveSendInfo{iUE} = sendInfoBit;
        end
        
        % PRBS结束时间
        time = etime(clock,t0);
        if time < 0.2
            pause(0.2-time);    % 延时到指定时刻
        end
        fprintf('PRBS数据生成模块处理完成\n');
        
        % =================== 基带处理模块 ===================================
        for iUE = 1:nUE
            nTB = LTE_par.UE_par.nCW(iUE);          % iUE的TB数
            nLayer = LTE_par.UE_par.nLayer(iUE);    % iUE的层数
            PMI = LTE_par.UE_par.PMI(iUE);          % 第iUE个用户的预编码码本索引
            M_0_SYMB = LTE_par.UE_par.M_0_SYMB(iUE);% 码字0调制符号数
            cbConcatBit = cell(nTB,1);              % 保存码块级联符号
            modSymbCell = cell(nTB,1);              % 保存调制符号
            f = [];                                 % 码块级联临时变量
            
            sendInfoBit = saveSendInfo{iUE};
            for iTB = 1:nTB
                Qm = LTE_par.UE_par.Qm(iTB,iUE);                            % 调制方式对应的阶数
                % 码块分割
                segBit = codeblock_segment(sendInfoBit{iTB},iUE,iTB);
                nCB = LTE_par.UE_par.nCB(iTB,iUE);                              % 获取当前用户CB数
                for iCB = 1:nCB
                    % Turbo 编码
                    encodeBit = turbo_encoder(segBit{iCB});
                    if strcmp(LTE_par.setpar, 'loadPar');
                        saveCodeBit((iCB-1)*3+1:iCB*3,:) = encodeBit;
                    end
                    % 速率匹配
                    rateMatchBit = rate_match(encodeBit,iUE,iTB,iCB);
                    % 码块级联
                    f = cat(2,f,rateMatchBit);
                end
                
                % 加扰
                scrambleBit = scramble(f,iTB,RNTI,iSubFrame,cellID);
                
                % 调制
                modSymb = modulation(scrambleBit,Qm);
                modSymbCell{iTB} = modSymb;
                cbConcatBit{iTB} = f;
                f = [];
            end
            % 层映射
            layerSymb = layer_mapping(modSymbCell,nTB,nLayer,preProcess);
            
            % 预编码
            precodedSymb = precoding(layerSymb,preProcess,transMod,nTx,PMI,M_0_SYMB);
            
            % 子载波映射 得到天线端口上资源格形式的复值符号
            % 输出为cell类型  举例:mapSymbCell{iTx}(iCarr,iOfdm)
            mapSymbCell = sub_carr_mapping(precodedSymb,iUE);
            
            % 频谱搬移 频域位置交换{B A}-->{A B}
            for iTx = 1:nTx
                mapSymbCell{iTx} = [mapSymbCell{iTx}(FFT_SIZE/2+1:FFT_SIZE,:);mapSymbCell{iTx}(1:FFT_SIZE/2,:)];
            end
            
            % % OFDM符号生成
            ofdmSymb = ofdm_generation(mapSymbCell,FFT_SIZE,nTx,CP);
        end
    else
        
        fprintf('当前子帧参数配置错误,等待下一帧!!!\n');
    end
    
    if strcmp(LTE_par.setpar, 'manuPar');
        
        time = etime(clock,t0);
        pause(5-time);
        
        % ============== 从19.6s开始高层清零 产生新参数 并下发 ====================
        fprintf('高层清零 产生新参数\n')
        t0 = clock;
        
        % 保存当前帧参数,用来估计业务复杂程度
        save_par = LTE_par;
        updata_parameter();
        time = etime(clock,t0);
        if time < 1
            pause(1-time);
        end
        
        load NextPar;
        LTE_par = next_LTE_par;
        
        % =============== 从19.8s 检查参数合理性 =================================
        fprintf('检查参数合理性 产生新参数\n')
        % 检查参数合理性
        errorMsg = [];
        errNum = 1;
        % 参数检查函数
        
        currentErrFlag = LTE_par.errFlag;
        LTE_check_parameters;
        
        if errNum == 1
            LTE_par.errFlag = false;
            fprintf('下一个子帧参数配置正确\n')
        else
            LTE_par.errFlag = true;
            fprintf('下一个子帧参数配置错误\n')
            for iMsg = 1:errNum
                disp(errorMsg{iMsg});
            end
        end
        
        % =============== 根据业务复杂程度,模拟基带处理时间 ======================
        if currentErrFlag == false
            if sum(save_par.UE_par.nRB) > 0.8*save_par.RB_DL
                overFlow = 0.5+rand;
                if mean(mean(save_par.UE_par.Qm)) > 4;
                    overFlow = overFlowFlag + 0.3;
                end
            else
                overFlow = 0.2+rand;
            end
            
            if overFlow > 1
                fprintf('基带处理超时,数据抛弃 !\n')
            else
                fprintf('基带处理正常,数据保存 !\n')
                LTE_par.genFlag = LTE_par.genFlag+1;
            end
            
        else
            fprintf('参数配置错误,未做基带处理 !\n')
        end
        
    end
    
    % 将'业务数据.dat'在各个模块的信息保存
    if strcmp(LTE_par.setpar, 'loadPar');
        saveSegBit1 = segBit{1};                % 第一个码块分割后数据 2进制
        saveSegBit2 = segBit{2};                % 第二个码块分割后数据 2进制
        saveCodeBit1 = saveCodeBit(1:3,:);      % 第一个码块编码后数据 2进制
        saveCodeBit2 = saveCodeBit(4:6,:);      % 第二个码块编码后数据 2进制
        saveConBit = cbConcatBit{1};            % 速率匹配后码块级联数据 2进制
        saveScrambleBit = scrambleBit;          % 加扰后的数据 2进制
        saveModSymb = modSymb;                  % 经过调制的复值符号 复数
        % 将各模块数据结果保存为.mat文件
        save 各模块数据.mat saveSegBit1 saveSegBit2 saveCodeBit1 saveCodeBit2 saveConBit saveScrambleBit saveModSymb
        
        % 将各模块数据结果保存为.dat文件
        segment1 = '第一个码块分割后result.dat'; % 第一个码块分割后数据 16进制
        write_result(saveSegBit1,segment1,0);
        segment2 = '第二个码块分割后result.dat'; % 第二个码块分割后数据 16进制
        write_result(saveSegBit2,segment2,0);
        encode1 = '第一个码块编码后result.dat';  % 第一个码块编码后数据 16进制
        write_result(saveCodeBit1,encode1,0);
        encode2 = '第二个码块编码后result.dat';  % 第二个码块编码后数据 16进制
        write_result(saveCodeBit2,encode2,0);
        concat = '码块级联后数据result.dat';     % 速率匹配后码块级联数据 16进制
        write_result(saveConBit,concat,0);
        scramb = '加扰后result.dat';            % 加扰后数据 16进制
        write_result(saveScrambleBit,scramb,0);
        mod = '调制后result.dat';               % 调制后复值符号 复数
        write_result(saveModSymb,mod,1);
        
        
        fprintf('仿真结果保存在当前文件夹下,分别保存为 .mat 格式和 .dat格式\n');
        
    end
    
end
if strcmp(LTE_par.setpar, 'manuPar');
    fprintf('可发送有效数据总计: %d 次\n',LTE_par.genFlag-1);
end
WaitBar(iSimu/LTE_par.nTime,bar,'仿真结束!!!');
pause(2);
WaitBar(0,bar,'');